using Magiq.Delete;
using Magiq.Insert;
using Magiq.Query;
using Magiq.Support;
using Magiq.Update;

namespace Magiq
{
    public interface IMagiqProvider
    {
        IUpdateStrategy GetUpdateStrategy<T>(IUpdate<T> update) where T : class;

        IDeleteStrategy GetDeleteStrategy<T>(IDelete<T> delete) where T : class;

        IInsertStrategy GetInsertStrategy<TSource, TDestination, TNew>(IInsert<TSource, TDestination, TNew> insert)
            where TDestination : class where TNew : class, TDestination, new();

        IInsertDestination<TNew> GetInsertDestination<TSource, TDestination, TNew>(IInsert<TSource, TDestination, TNew> insertDestinationDefinition)
            where TNew : class, TDestination, new()
            where TDestination : class;

        IQueryStrategy<T> GetQueryStrategy<T>(IQuery<T> query) where T : class;
    }
}